import axios, { AxiosHeaders } from 'axios'
// 把 vant 的 Dialog 组件拿过来
import { Dialog } from 'vant'
import type { AxiosRequestConfig } from 'axios'

// 创建 axios 实例
const instance = axios.create({
  baseURL: 'http://47.94.148.165:3001/api',
  timeout: 10000
})

/*
  config 接受的本次请求的所有信息
    + TS 类型就是 AxiosRequestConfig
    + 默认人家是有 headers 的
    + 默认人家的 headers 内是没有 token 属性
    + 我们需要把 token 属性补充在人家的 TS 格式类型上
    + 我们就可以添加 token 属性
*/

// 制作一个自己的请求头格式
// myAxiosRequestConfig 继承自 AxiosRequestConfig
//   用来限制的是 config 这个对象
// 我再使用断言的时候
// config.headers as myAxiosRequestConfig
// 修改后
// (config as myAxiosRequestConfig).headers.token
interface myAxiosRequestConfig extends AxiosRequestConfig {
  headers: { token?: string | null }
}

// 配置请求拦截器
instance.interceptors.request.use((config: AxiosRequestConfig) => {
  // 所有的请求都要经过我

  // 判断是 获取用户信息
  if (config.url === '/user/info') {
    // ((config.headers as unknown) as myAxiosRequestConfig).token = window.localStorage.getItem('token')
    (config as myAxiosRequestConfig).headers.token = window.localStorage.getItem('token')
  }

  // 判断是 购物车相关
  // 所有的购物车相关接口都是 /cart/xxxx
  // 只要判断是以 /cart 开头的, 就可以
  // 每一个购物车相关的接口都要判断 token 是否真实有效
  // 可以在响应拦截器内做判断
  if (/^\/cart/.test(config.url as string)) {
    // 拿到 token 进行添加
    // (config.headers as AxiosRequestConfig<AxiosHeaders>).token = window.localStorage.getItem('token')
    (config as myAxiosRequestConfig).headers.token = window.localStorage.getItem('token')
  }

  // 查询所有订单
  if (config.url === '/user/orderlist') {
    // (config.headers as AxiosRequestConfig<AxiosHeaders>).token = window.localStorage.getItem('token')
    (config as myAxiosRequestConfig).headers.token = window.localStorage.getItem('token')
  }

  // 判断是 订单相关

  return config
})

// 配置响应拦截器
instance.interceptors.response.use(
  response => {

    // 判断如果返回的内容的 code 为 '10119'
    // 那么就表示无效 token
    // 做出提示
    if (response.data.code === '10119') {
      Dialog({
        title: '提示',
        message: '您登录状态有问题, 请重新登录'
      })

      return { code: 0 }
    }

    return response.data
  },
  err => {
    Dialog.alert({ title: '网络错误', message: '网络不给力, 稍后再来' })
  }
)

// 导出实例
export default instance







// interface ReactiveObj {
//   name: string,
//   age: number
// }

// // 向 ReactiveObj 上扩展一个内容
// interface MyObj extends ReactiveObj {
//   token: string
// }

// const o1: MyObj = { name: 'Jack', age: 18, token: 'asdasdasd' }

// o1.name = 'Jack'
// o1.age = 18
// o1.token = 'ashdghasgdh.sdfghjasdfhj.sdfhjasdfjgh'
